package p5;
import java.util.function.*;

import static tool.print.*;

/**
 * 在这里给出对类 Main 的描述。
 * 
 * @作者（你的名字）
 * @版本（一个版本号或者一个日期）
 */
public class Main
{
    /*
    public static void test()
    {
        G2 g = new G2()
        {
           
        };
    }
    */
    //f(x) = y => x
    public static int f1(F y , int x)
    {
        return y.f(x);
    }
    //g(x) = f => y => x
    public static int gf(F y , F g , int x)
    {
        return g.f(y.f(x));
    }
    
    public static int ff(G g , int x)
    {
        F f = t->t+1;
        return f1(g.g(f) , x);
    }
    
    public static void main()
    {
        //匿名类 λ化简
        F f = x-> x+1;
        int res;
        //f(x) = x + 1;
        res = f1(f, 2);
        pln(res);
        
        //g(f(x)) = g(x+1) = (x+1)-1
        res = gf(f, x->x-1 , 2);
        pln(res);
        
        //g(f(x)) = g(x+3) = (x+3)+1
        f = f.gf(x-> x+3);
        res = f1(f,2);
        pln(res);
        
        //G
        //g(x) = f(x) + f(x)
        G g = y-> x-> y.f(x) + y.f(x);
        res = ff(g,3);
        pln(res);
        
        //G2
        //g(x) = f1(x) + f2(x) =
        F f1 = x-> x+2,
          f2 = x-> x+3;
        //λλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλ表达式
        //G2 g2 =  y-> x-> y.f1(x) + y.f2(t);
        
        
        //g(x) = f1(x) + f2(x) =
        /*
        g = y-> x-> y.f(x) + y.f(x);
        res = ff(g,3);
        pln(res);
        */
        
        /*
        Function<Integer, Integer> f11 = x -> x + 1;
        Function<Integer, Integer> g11 = x -> x * x;
        pln(g11.compose(f11).apply(2));
        */
    }
    
    
    
}
